import hashlib


def can_do_work(now: float, duration: float, schedule_list: list[tuple[float, float]]) -> bool:
    """
    检查当前是否可以工作
    - 是否有限制
    - 是否在限制范围内
    - 不在限制内，是否有足够的空闲时间
    """
    # 无限制时，直接可用
    if not schedule_list:
        return True
    # 若now 大于等于 最大限制时间(结束时间)，则可用
    if now >= schedule_list[-1][1]:
        return True
    # 判断是否在不可用范围内
    for begin, end in schedule_list:
        if begin <= now <= end:
            return False
    # 若不在不可用范围内，校验是否有足够空闲时间
    for begin, end in schedule_list:
        if begin > now:
            available_time = begin - now
            return available_time >= duration


def hc_work_num(now: float, duration: float, schedule_list: list[tuple[float, float]]) -> int:
    """
    环穿 被锁定数量
    """
    now_nums = 0
    after_nums = 0
    for begin, end in schedule_list:
        if begin <= now <= end:
            now_nums += 1
        if begin <= (now + duration) <= end:
            after_nums += 1
    return max(now_nums, after_nums)


def can_work_max_time(now: float, duration: float, schedule_list: list[tuple[float, float]]) -> bool:
    """
    最大可工作时长
    """
    max_time = 0
    for begin, end in schedule_list:
        if end > max_time:
            max_time = end
    return now > max_time


def is_ptx_task(queue):
    """
    是否为PTX任务，会存在包规不准的问题
    """
    return queue.template_id and queue.template_id == 'PTX'


def longest_ts() -> int:
    return 4075171320


def find_free_time(timestamps):
    # 将时间戳按开始时间排序
    sorted_timestamps = sorted(timestamps, key=lambda x: x[0])

    free_times = []
    prev_end = sorted_timestamps[0][0]

    for start, end in sorted_timestamps:
        # 检查当前时间戳和前一个时间戳之间是否存在空闲时间段
        if start > prev_end:
            free_times.append((prev_end, start))
        prev_end = max(prev_end, end)

    return free_times


def str_hash_to_int(raw_str: str, size: int) -> int:
    """
    将 字符串 转换为 一个固定的数字
    """
    return sum([int(_) for _ in hashlib.md5(str.encode('utf-8')).hexdigest() if _.isnumeric()]) % size
